//构成交替字符串需要的最小交换次数
/*给你一个二进制字符串 s ，现需要将其转化为一个 交替字符串 。请你计算并返回转化所需的 最小 字符交换次数，如果无法完成转化，返回 -1 。

交替字符串 是指：相邻字符之间不存在相等情况的字符串。例如，字符串 "010" 和 "1010" 属于交替字符串，但 "0100" 不是。

任意两个字符都可以进行交换，不必相邻 。
*/
class Solution {
public:
    int _is_right1(string& s) {
        int _dir = 0;
        int floag = 0;
        for (auto& val : s) {
            if (floag % 2 == 0 && val != '0') {
                _dir++;
            } else if (floag % 2 == 1 && val != '1') {
                _dir++;
            }
            floag++;
        }
        return _dir;
    }
    int _is_right2(string& s) {
        int _dir = 0;
        int floag = 0;
        for (auto& val : s) {
            if (floag % 2 == 1 && val != '0') {
                _dir++;
            } else if (floag % 2 == 0 && val != '1') {
                _dir++;
            }
            floag++;
        }
        return _dir;
    }
    int minSwaps(string s) {
        int sum = 0;
        int one_count = 0;
        for (auto& val : s) {
            if (val == '1')
                one_count++;
            sum++;
        }

        if (sum % 2) {
            if (one_count != sum / 2 + 1 && one_count != sum / 2)
                return -1;
            if (one_count == sum / 2 + 1) {
                int n2 = _is_right2(s) / 2;
                return n2;
            } else {
                int n1 = _is_right1(s) / 2;
                return n1;
            }
        } else {
            if (one_count != sum / 2)
                return -1;
            int n1 = _is_right1(s) / 2;
            int n2 = _is_right2(s) / 2;
            return n1 < n2 ? n1 : n2;
        }

        // return _is_right1(s) < _is_right2(s) ? _is_right1(s) : _is_right2(s);
        return 0;
    }
};